package main

import "fmt"

type Inter interface {
	Ping()
	Pang()
}

type St struct{}

func (St) Ping() {
	fmt.Println("Ping")
}

func (*St) Pang() {
	fmt.Println("Pang")
}

func main() {
	var st *St = nil
	var it Inter = st

	fmt.Printf("%p\n", st) //0x0 代表是 nil
	fmt.Printf("%p\n", it) //0x0 代表是 nil

	if it != nil { //go语言的一点瑕疵，fmt.Printf("%p\n", it)的结果是 0x0x，但是it != nil 判断结果是 true
		it.Pang() //Pang

		//下面的语句会导致panic
		//方法转换为函数调用，第一个参数是 St 类型，
		//由于 *St 是 nil，无法获取指针所指的对象的值，所以导致 panic
		it.Ping() //panic: runtime error: invalid memory address or nil pointer dereference
	}
}
